You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.8 KiB
45 lines
1.8 KiB
|
2 months ago
|
import React from "react";
|
||
|
|
import { getProductById } from "../../../../lib/data";
|
||
|
|
|
||
|
|
export const revalidate = 300;
|
||
|
|
|
||
|
|
export default function ProductPage({ params }: { params: { locale: string; id: string } }) {
|
||
|
|
const { locale, id } = params;
|
||
|
|
const t = {
|
||
|
|
notFound: locale === "en" ? "Product Not Found" : "产品未找到",
|
||
|
|
back: locale === "en" ? "Back" : "返回首页",
|
||
|
|
home: locale === "en" ? "Home" : "首页",
|
||
|
|
addToCart: locale === "en" ? "Add to cart" : "加入购物车",
|
||
|
|
} as const;
|
||
|
|
const data = getProductById(id, locale);
|
||
|
|
if (!data) {
|
||
|
|
return (
|
||
|
|
<div className="mx-auto max-w-screen-md px-4 py-12">
|
||
|
|
<h1 className="text-2xl font-semibold">{t.notFound}</h1>
|
||
|
|
<a className="mt-6 inline-block text-blue-600" href={`/${locale}`}>{t.back}</a>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
const { product, floor } = data;
|
||
|
|
return (
|
||
|
|
<div className="mx-auto max-w-screen-md px-4 py-8">
|
||
|
|
<div className="text-sm text-gray-600 mb-4">
|
||
|
|
<a href={`/${locale}`}>{t.home}</a> / <a href={`/${locale}/channel/${floor.id.replace(/^floor-/, '')}`}>{floor.title}</a> / <span>{product.name}</span>
|
||
|
|
</div>
|
||
|
|
<div className="grid md:grid-cols-2 gap-6">
|
||
|
|
<img src={product.image} alt={product.name} className="w-full object-cover rounded-lg aspect-square bg-white" />
|
||
|
|
<div className="space-y-4">
|
||
|
|
<h1 className="text-2xl font-semibold">{product.name}</h1>
|
||
|
|
{product.description && <p className="text-gray-600">{product.description}</p>}
|
||
|
|
{product.price != null && <div className="text-rose-600 text-xl font-semibold">¥{product.price}</div>}
|
||
|
|
<div className="pt-4">
|
||
|
|
<button className="px-5 py-2.5 rounded bg-black text-white">{t.addToCart}</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
|